/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package subSetor;

import java.util.List;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import util.ErroAcessoRepositorioException;
import util.HibernateUtil;

/**
 *
 * @author PauloM
 */
public class RepositorioSubSetor implements IRepositorioSubSetor {

        /**
     * Mensagem que indica erro de acesso ao banco de dados.
     */
    private static final String MSG_ERRO_ACESSO_BD = "Erro de acesso ao banco de dados";

    /**
     *
     * @param objSubSetor
     * @throws ErroAcessoRepositorioException
     */
    public void cadastrarAtualizar(SubSetor objSubSetor) throws ErroAcessoRepositorioException {
        Session s = null;
        Transaction t = null;

        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();

            s.saveOrUpdate(objSubSetor);

            // Comitando tudo caso der certo
            t.commit();

        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }


    }

    /**
     * Metodo que ira produrar o SubSetor
     *
     * @param int idSubSetor
     * @return void
     */
    public SubSetor procurar(int idSubSetor) throws SubSetorNaoCadastradoException, ErroAcessoRepositorioException {
        SubSetor objSubSetor = null;
        if (this.existe(idSubSetor)) {

            Session s = null;
            Transaction t = null;

            try {

                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = (Transaction) s.beginTransaction();
                // Salvando o SubSetor no banco
                objSubSetor = (SubSetor) s.get(SubSetor.class, idSubSetor);
                // Comitando tudo caso der certo
                t.commit();
            } catch (Exception e) {
                //t.rollback();

                throw new SubSetorNaoCadastradoException();
            }
        } else {
            throw new SubSetorNaoCadastradoException("SubSetor Não Cadastrado");
        }

        return objSubSetor;
    }
    
    /**
     * Metodo que ira listar os Categorias
     *
     * @return Collection
     */
    public List<SubSetor> procurarPorDescricaoPorSetor(String descricaoSubSetor, int idSetor) throws Exception, ErroAcessoRepositorioException {
        List<SubSetor> listSubSetor = null;
        Session s = null;
        Transaction t = null;
        try {
            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = s.beginTransaction();
            // criando o sql
            String sql = "from SubSetor WHERE id_sub_setor IS NOT NULL ";
            if(descricaoSubSetor.trim().length() > 0){
                sql += " AND descricao_sub_setor LIKE :descricao_sub_setor ";
            }
            if(idSetor > 0){
                sql += " AND id_sub_setor = :id_sub_setor ";
            }
            // Criando a query
            Query q = s.createQuery(sql);
            if(descricaoSubSetor.trim().length() > 0){
                q.setParameter("descricao_sub_setor", "%" + descricaoSubSetor + "%");
            }
            if(idSetor > 0){
                q.setParameter("id_sub_setor", idSetor);
            }
            
            // Listando as categorias
            listSubSetor = q.list();
            
            t.commit();
            
        } catch (Exception e) {
            t.rollback();
            throw new ErroAcessoRepositorioException(e.getMessage(), null, 1);
        }
        return listSubSetor;
    }

    /**
     * Metodo que ira verificar a existência do SubSetor
     *
     * @param int idSubSetor
     * @return void
     */
    public boolean existe(int idSubSetor) throws ErroAcessoRepositorioException {

        SubSetor objSubSetor = null;

        Session s = null;
        Transaction t = null;

        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();

            // Salvando o SubSetor no banco


            objSubSetor = (SubSetor) s.get(SubSetor.class, idSubSetor);

        } catch (Exception e) {
            t.rollback();
        }
        return (objSubSetor != null);

    }

    /**
     * Metodo que ira listar o SubSetor
     *
     * @return Collection
     */
    public List<SubSetor> listar(String strComplemento) throws Exception, ErroAcessoRepositorioException {
        List<SubSetor> listSubSetor = null;
        Session s = null;
        Transaction t = null;
        try {

            s = HibernateUtil.getSessionFactory().getCurrentSession();
            t = (Transaction) s.beginTransaction();

            Query q = (Query) s.createQuery("from SubSetor WHERE id_sub_setor IS NOT NULL " + strComplemento);
            
            listSubSetor = q.list();

            t.commit();

        } catch (Exception e) {
            t.rollback();
            System.out.println(e.getMessage());
            throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
        }

        return listSubSetor;
    }
    
    /**
     * Metodo que ira listar o SubSetor
     *
     * @return Collection
     */
    public List<SubSetor> listarAtivos() throws Exception, ErroAcessoRepositorioException {
        String complemento = " AND status_subsetor = true ORDER BY id_sub_setor";
        
        return this.listar(complemento);
    }

    /**
     * Método que ira remover o SubSetor do banco
     *
     * @param idSubSetor
     */
    public void remover(int idSubSetor) throws SubSetorNaoCadastradoException, ErroAcessoRepositorioException {

        SubSetor objSubSetor = null;
        if (this.existe(idSubSetor)) {
            Session s = null;
            Transaction t = null;
            try {

                s = HibernateUtil.getSessionFactory().getCurrentSession();
                t = (Transaction) s.beginTransaction();

                // Recupero o meu SubSetor
                objSubSetor = (SubSetor) s.get(SubSetor.class, idSubSetor);
                
                // Seto seu id como excluido
                objSubSetor.setStatusSubSetor(false);
                
                // Comintando
                t.commit();
                
                // Atualizo ele pra excluido
                this.cadastrarAtualizar(objSubSetor);
            } catch (Exception e) {
                //t.rollback();
                //  this.objSession.close();
                throw new ErroAcessoRepositorioException(MSG_ERRO_ACESSO_BD, null, 1);
            }
            // this.objSession.close();

        } else {
            throw new SubSetorNaoCadastradoException();

        }
    }
}
